﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Calendar;
using Turnero.Entidades;
using Turnero.DAOs;


namespace Turnero
{
    public partial class Principal : Form
    {
        List<CalendarItem> _items = new List<CalendarItem>();
        CalendarItem contextItem = null;
        DataSet ds;
        public Int32 idPre;
        int banderaPantalla;
        DateTime DateStart, DateEnd;
        DateTime diaSeleccionado;
        DateTime inicio;
        Int32 diaInicio1;
        int diaLunesInicial;

        public Principal()
        {
            InitializeComponent();
            configurarDias();
            calendar1.Enabled = false;
            calendarioMeses.Enabled = false;
            setearOffset();
            
            
        }

        private void setearOffset()
        {
            switch (calendar1.TimeScale)
            {
                case CalendarTimeScale.FiveMinutes:
                    {
                        calendar1.TimeUnitsOffset = -96;
                        break;
                    }
                case CalendarTimeScale.TenMinutes:
                    {
                        calendar1.TimeUnitsOffset = -48;
                        break;
                    }
                case CalendarTimeScale.FifteenMinutes:
                    {
                        calendar1.TimeUnitsOffset = -32;
                        break;
                    }
                case CalendarTimeScale.ThirtyMinutes:
                    {
                        calendar1.TimeUnitsOffset = -16;
                        break;
                    }
                case CalendarTimeScale.SixtyMinutes:
                    {
                        calendar1.TimeUnitsOffset = -8;
                        break;
                    }
        
            }
        }

        private void configurarDias()
        {
                      

            inicio = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 07, 00, 00);
            calendar1.SetViewRange(inicio, inicio.AddDays(2));

            setearLunes(inicio);
         
        }

        public void configurarDiasFueraInicio()
        {


            DateTime fechaYhora = new DateTime(calendarioMeses.SelectionStart.Year, calendarioMeses.SelectionStart.Month, calendarioMeses.SelectionStart.Day, 10, 00, 00);
            DateTime fechaYhoraFin = new DateTime(calendarioMeses.SelectionEnd.Year, calendarioMeses.SelectionEnd.Month, calendarioMeses.SelectionEnd.Day, 10, 00, 00);
            calendar1.SetViewRange(fechaYhora, fechaYhoraFin.AddDays(2));

            setearLunes(calendarioMeses.SelectionStart);
        }
        private void setearLunes(DateTime fecha)
        {
            switch (fecha.DayOfWeek.ToString())
            {
                case "Saturday":
                    {
                        txtSemana.Text = fecha.AddDays(-5).ToShortDateString();
                        break;
                    }

                case "Sunday":
                    {
                        txtSemana.Text = fecha.AddDays(-6).ToShortDateString();
                        break;
                    }
                case "Friday":
                    {
                        txtSemana.Text = fecha.AddDays(-4).ToShortDateString();
                        break;
                    }

                case "Thursday":
                    {
                        txtSemana.Text = fecha.AddDays(-3).ToShortDateString();
                        break;
                    }

                case "Wednesday":
                    {
                        txtSemana.Text = fecha.AddDays(-2).ToShortDateString();
                        break;
                    }
                case "Tuesday":
                    {
                        txtSemana.Text = fecha.AddDays(-1).ToShortDateString();
                        break;
                    }

                case "Monday":
                    {
                        txtSemana.Text = fecha.ToShortDateString();
                        break;
                    }

            }
        }

        public void cargarTurnos()
        {
            try
            {
                removeItems();

                TurnosBD tbd = new TurnosBD();

                DataSet ds = tbd.getTurnos(idPre);

                List<ItemInfo> lst = new List<ItemInfo>();

                for (int i = 0; i < ds.Tables["turnos"].Rows.Count; i++)
                {
                    Array vector = ds.Tables["turnos"].Rows[i].ItemArray;

                    String vectorNombreYApe = ds.Tables["turnos"].Rows[i][8].ToString() + ", " + ds.Tables["turnos"].Rows[i][7].ToString();


                    string diaTurno = vector.GetValue(1).ToString();
                    DateTime diaTurnoFecha = Convert.ToDateTime(diaTurno);
                    string diaTurnoDef = diaTurnoFecha.ToShortDateString();

                    string horaInicio = vector.GetValue(2).ToString() + ":" + vector.GetValue(3).ToString();
                    string horaHasta = vector.GetValue(4).ToString() + ":" + vector.GetValue(5).ToString();


                    DateTime StartTime = DateTime.Parse(diaTurnoDef + " " + horaInicio + ":00");
                    DateTime EndTime = DateTime.Parse(diaTurnoDef + " " + horaHasta + ":00");

                    string Text = vectorNombreYApe.ToString();
                    int idTurno = int.Parse(vector.GetValue(0).ToString());


                    ItemInfo item = new ItemInfo(StartTime, EndTime, Text, idTurno);

                    CalendarItem cal = new CalendarItem(calendar1, item.StartTime, item.EndTime, item.Text);

                    _items.Add(cal);

                }
                foreach (CalendarItem item in _items)
                {
                    if (calendar1.ViewIntersects(item))
                    {
                        calendar1.Items.Add(item);
                    }
                }

                
                PlaceItems();
                calendar1.Select();
                
            }



            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                MessageBox.Show("Error al recuperar turnos");
            }

        }


        private void monthView1_SelectionChanged(object sender, EventArgs e)
        {
            



            DateTime fechaYhora = new DateTime(calendarioMeses.SelectionStart.Year, calendarioMeses.SelectionStart.Month, calendarioMeses.SelectionStart.Day, 10, 00, 00);
            DateTime fechaYhoraFin = new DateTime(calendarioMeses.SelectionStart.Year, calendarioMeses.SelectionStart.Month, calendarioMeses.SelectionStart.Day, 10, 00, 00);
            calendar1.SetViewRange(fechaYhora, fechaYhoraFin.AddDays(2));

            setearLunes(calendarioMeses.SelectionStart);
            if (txtApellidos.Text.Trim() != "")
            {
                calendar1.Enabled = true;
                calendarioMeses.Enabled = true;
                cargarTurnos();
            }
            else
            {
                removeItems();
                calendar1.Enabled = false;
                calendarioMeses.Enabled = false;
            }
        }

        private void Principal_Load(object sender, EventArgs e)
        {
            
            txtMP.Focus();
           
        }

   
        private void calendar1_LoadItems(object sender, CalendarLoadEventArgs e)
        {
            PlaceItems();
        }

        private void removeItems()
        {
            calendar1.Items.Clear();
            _items.Clear();
        }

        private void PlaceItems()
        {
            foreach (CalendarItem item in _items)
            {
                if (calendar1.ViewIntersects(item))
                {
                    calendar1.Items.Add(item);
                }
            }
        }

        private void calendar1_ItemCreated(object sender, CalendarItemCancelEventArgs e)
        {
            _items.Add(e.Item);
        }

        private void calendar1_ItemDoubleClick(object sender, CalendarItemEventArgs e)
        {
            
            
            if (txtApellidos.Text.Trim() != "")
            {
                if (e.Item.Text == "")
                {
                    bool validarDia;

                    
                    string minutosInicio = e.Item.StartDate.Minute.ToString();
                    if (minutosInicio == "0")
                    {
                        minutosInicio = "00";
                    }
                    String horaInicio = e.Item.StartDate.Hour.ToString() + minutosInicio;

                    DayOfWeek diaInicio = e.Item.StartDate.DayOfWeek;
                    

                    switch (diaInicio.ToString())
                    {
                        case "Saturday":
                            {
                                diaInicio1 = 6;
                                break;
                            }

                        case "Sunday":
                            {
                                diaInicio1 = 7;
                                break;
                            }
                        case "Friday":
                            {
                                diaInicio1 = 5;
                                break;
                            }

                        case "Thursday":
                            {
                                diaInicio1 = 4;
                                break;
                            }

                        case "Wednesday":
                            {
                                diaInicio1 = 3;
                                break;
                            }
                        case "Tuesday":
                            {
                                diaInicio1 = 2;
                                break;
                            }

                        case "Monday":
                            {
                                diaInicio1 = 1;
                                break;
                            }

                    }

                    validarDia = validaDia(idPre,diaInicio1,Convert.ToInt32(horaInicio));

                    if (validarDia == false)
                    {
                        MessageBox.Show("El profesional no está disponible en ese horario","Fuera de Cronograma");
                        removeItems();
                        cargarTurnos();
                        
                        setearLunes(calendarioMeses.SelectionStart);
                        setearVista();
                        
                        //DateTime fechaYhora = new DateTime(calendarioMeses.SelectionStart.Year, calendarioMeses.SelectionStart.Month, calendarioMeses.SelectionStart.Day, 10, 00, 00);
                        //DateTime fechaYhoraFin = new DateTime(calendarioMeses.SelectionEnd.Year, calendarioMeses.SelectionEnd.Month, calendarioMeses.SelectionEnd.Day, 10, 00, 00);
                        //calendar1.SetViewRange(fechaYhora, fechaYhoraFin.AddDays(2));

                        //setearLunes(calendarioMeses.SelectionStart);
                        //if (txtApellidos.Text.Trim() != "")
                        //{
                        //    calendar1.Enabled = true;
                        //    calendarioMeses.Enabled = true;
                        //    cargarTurnos();
                        //}
                        //else
                        //{
                        //    removeItems();
                        //    calendar1.Enabled = false;
                        //    calendarioMeses.Enabled = false;
                        //}
                    }
                    else
                    {
                        string horaDesde = e.Item.StartDate.Hour.ToString();
                        string minutosDesde = e.Item.StartDate.Minute.ToString();
                        if (minutosDesde == "0")
                        {
                            minutosDesde = "00";
                        }
                        string horaCompletaDesde = horaDesde + ":" + minutosDesde;

                        string horaHasta = e.Item.EndDate.Hour.ToString();
                        string minutosHasta = e.Item.EndDate.Minute.ToString();
                        if (minutosHasta == "0")
                        {
                            minutosHasta = "00";
                        }
                        string horaCompletaHasta = horaHasta + ":" + minutosHasta;

                        //MessageBox.Show("Turno: " + e.Item.Text + "\nDia: "+e.Item.StartDate.Day+"/"+e.Item.StartDate.Month+"/"+e.Item.StartDate.Year + "\nDesde: " + e.Item.StartDate.Hour+":"+e.Item.StartDate.Minute + "\nHasta: " + e.Item.EndDate.Hour+":"+e.Item.EndDate.Minute, "Turno");
                        //MessageBox.Show("Turno: " + e.Item.Text + "\nDia: " + e.Item.StartDate.Day + "/" + e.Item.StartDate.Month + "/" + e.Item.StartDate.Year + "\nDesde: " + horaCompletaDesde + "\nHasta: " + horaCompletaHasta, "Turno");
                        string dia = e.Item.StartDate.Day + "/" + e.Item.StartDate.Month + "/" + e.Item.StartDate.Year;

                        diaSeleccionado = Convert.ToDateTime(dia);

                        Turnero.Turnos.AltaTurno frmAltaTurno = new Turnero.Turnos.AltaTurno(this, dia, horaDesde, minutosDesde, idPre, horaHasta, minutosHasta);
                        frmAltaTurno.ShowDialog();
                    }
                }
                else
                {
                    string horaDesde = e.Item.StartDate.Hour.ToString();
                    string minutosDesde = e.Item.StartDate.Minute.ToString();
                    if (minutosDesde == "0")
                    {
                        minutosDesde = "00";
                    }
                    string dia = e.Item.StartDate.Day + "/" + e.Item.StartDate.Month + "/" + e.Item.StartDate.Year;
                    TurnosBD tbd = new TurnosBD();
                    Int32 idTurno = tbd.DameIdTurno(idPre, horaDesde, minutosDesde, dia);
                    if (idTurno != 0)
                    {
                        Turnero.Turnos.ModificarEliminarTurno frmModEliTurno = new Turnero.Turnos.ModificarEliminarTurno(idTurno, this);
                        frmModEliTurno.ShowDialog();

                    }
                }
            }
            else
                cargarTurnos();

           // configurarDiasFueraInicio();
        }

        private bool validaDia(Int32 idProfesional, Int32 idDia, Int32 horaInicio)
        {
            bool resultado;
            DAOs.TurnosBD tbd = new DAOs.TurnosBD();
            resultado = tbd.validaDia(idProfesional, idDia, horaInicio);
            return resultado;

        }

        private void txtMP_Leave(object sender, EventArgs e)
        {
            Turnero.Entidades.Profesional pr = new Turnero.Entidades.Profesional();
            DAO_Profesionales dp = new DAO_Profesionales();
            pr = dp.dameProfesionalesPorMPObj(txtMP.Text);
            if (pr != null)
            {
                
                idPre = Convert.ToInt32(pr.Cod);
                llenarCampos(pr);
                calendar1.Enabled = true;
                calendarioMeses.Enabled = true;
                setearOffset();
                configurarDias();
            }
            else
                idPre = 0;
        }

        public void llenarCampos(Turnero.Entidades.Profesional pr)
        {
            txtMP.Text = pr.Mat;
            txtApellidos.Text = pr.Ape + ", " + pr.Nom;
            calendar1.Enabled = true;
            calendarioMeses.Enabled = true;
            
            if(pr != null)
            buscarTiempos(pr);
            
            calendar1.SetViewRange(calendarioMeses.ViewStart, calendarioMeses.ViewStart.AddDays(2));
            
            cargarTurnos();
            
            
        }

        private void buscarTiempos(Turnero.Entidades.Profesional pr)
        {
            DAOs.TurnosBD tbd = new DAOs.TurnosBD();
            Int32 tiempoTurnos;
            tiempoTurnos = tbd.buscarTiempoEntreTurnos(pr);

            switch (tiempoTurnos)
            {
                case 5:
                    {
                        calendar1.TimeScale = CalendarTimeScale.FiveMinutes;
                        break;
                    }
                
                case 10:
                    {
                        calendar1.TimeScale = CalendarTimeScale.TenMinutes;
                        break;
                    }

                case 15:
                    {
                        calendar1.TimeScale = CalendarTimeScale.FifteenMinutes;
                        break;
                    }

                case 20:
                    {
                        calendar1.TimeScale = CalendarTimeScale.FifteenMinutes;
                        break;
                    }
                case 30:
                    {
                        calendar1.TimeScale = CalendarTimeScale.ThirtyMinutes;
                        break;
                    }

                case 60:
                    {
                        calendar1.TimeScale = CalendarTimeScale.SixtyMinutes;
                        break;
                    }
            }
        }

        private void txtMP_TextChanged(object sender, EventArgs e)
        {
            txtApellidos.Text = "";
            removeItems();
            calendar1.Enabled = false;
            calendarioMeses.Enabled = false;
        }

        private void txtMP_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                Turnero.Entidades.Profesional pr = new Turnero.Entidades.Profesional();
                DAO_Profesionales dp = new DAO_Profesionales();
                pr = dp.dameProfesionalesPorMPObj(txtMP.Text);
                if (pr != null)
                {
                    idPre = Convert.ToInt32(pr.Cod);
                    calendar1.Enabled = true;
                    calendarioMeses.Enabled = true;
                    

                    setearOffset();
                    configurarDias();
                    calendar1.Select();

                    llenarCampos(pr);
                    
                }
                else
                    idPre = 0;
            }
            
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            txtMP.Text = "";
            banderaPantalla = 1;
            Turnero.Profesional.frmGestionarModifcarProfesional fmp = new Turnero.Profesional.frmGestionarModifcarProfesional(this, banderaPantalla);
            fmp.ShowDialog();
        }

        private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {

        }

        private void entreTurnoToolStripMenuItem_Click(object sender, EventArgs e)
        {
          

           
              foreach (CalendarItem item in calendar1.GetSelectedItems())
                {

                    int bandera = 0;
                    string horaDesde = item.StartDate.Hour.ToString();
                    string minutosDesde = item.StartDate.Minute.ToString();
                    if (minutosDesde == "0")
                    {
                        minutosDesde = "00";
                    }
                    string horaCompletaDesde = horaDesde + ":" + minutosDesde;

                    string horaHasta = item.EndDate.Hour.ToString();
                    string minutosHasta = item.EndDate.Minute.ToString();
                    if (minutosHasta == "0")
                    {
                        minutosHasta = "00";
                    }
                    string horaCompletaHasta = horaHasta + ":" + minutosHasta;

                    //MessageBox.Show("Turno: " + e.Item.Text + "\nDia: "+e.Item.StartDate.Day+"/"+e.Item.StartDate.Month+"/"+e.Item.StartDate.Year + "\nDesde: " + e.Item.StartDate.Hour+":"+e.Item.StartDate.Minute + "\nHasta: " + e.Item.EndDate.Hour+":"+e.Item.EndDate.Minute, "Turno");
                    //MessageBox.Show("Turno: " + e.Item.Text + "\nDia: " + e.Item.StartDate.Day + "/" + e.Item.StartDate.Month + "/" + e.Item.StartDate.Year + "\nDesde: " + horaCompletaDesde + "\nHasta: " + horaCompletaHasta, "Turno");
                    string dia = item.StartDate.Day + "/" + item.StartDate.Month + "/" + item.StartDate.Year;


                      Int32 cantTurnos;
                      DAOs.TurnosBD tbd = new DAOs.TurnosBD();
                      cantTurnos = tbd.dameCantTurnos(idPre, dia, horaDesde, minutosDesde);
                      if (cantTurnos > 1)
                      {
                          MessageBox.Show("No se puede dar mas de 1 entreturno por horario");
                          break;
                      }
                      else
                      {
                          Turnero.Turnos.AltaTurno frmAltaTurno = new Turnero.Turnos.AltaTurno(this, dia, horaDesde, minutosDesde, idPre, horaHasta, minutosHasta);
                          frmAltaTurno.ShowDialog();
                          bandera = 1;
                          if (bandera == 1)
                              break;
                      }
                }

            
           
        }

       

        private void Principal_Activated(object sender, EventArgs e)
        {
                if (DateTime.Compare(calendarioMeses.SelectionStart, Convert.ToDateTime("01/01/0001")) == 0)
                    calendar1.SetViewRange(inicio, inicio.AddDays(2));
                 //configurarDias();
                else
                {
                    String fecha = calendar1.SelectionStart.ToShortDateString() + " 07:00:00";
                    calendar1.SetViewRange(Convert.ToDateTime(fecha), Convert.ToDateTime(fecha).AddDays(2));
                    //configurarDiasFueraInicio();
                }
                //calendarioMeses.Focus();
                // setearOffset();
                // calendarioMeses.Focus();
                cargarTurnos();
                 //calendar1.Select();

            //configurarDias();
           
        }

        private void calendar1_Scroll(object sender, ScrollEventArgs e)
        {
            
        }

        public void setearVista()
        {
            if (DateTime.Compare(calendarioMeses.SelectionStart, Convert.ToDateTime("01/01/0001")) == 0)
                calendar1.SetViewRange(inicio, inicio.AddDays(2));
            //configurarDias();
            else
            {
                DateTime fechaYhora = new DateTime(calendarioMeses.SelectionStart.Year, calendarioMeses.SelectionStart.Month, calendarioMeses.SelectionStart.Day, 10, 00, 00);
                DateTime fechaYhoraFin = new DateTime(calendarioMeses.SelectionStart.Year, calendarioMeses.SelectionStart.Month, calendarioMeses.SelectionStart.Day, 10, 00, 00);
                calendar1.SetViewRange(fechaYhora, fechaYhoraFin.AddDays(2));

                setearLunes(calendarioMeses.SelectionStart);
                //configurarDiasFueraInicio();
            }
            //calendarioMeses.Focus();
            // setearOffset();
            // calendarioMeses.Focus();
            cargarTurnos();

            
        }

        private void calendar1_ItemClick(object sender, CalendarItemEventArgs e)
        {
            txtPaciente.Text = e.Item.Text;
        }

        private void calendarioMeses_Click(object sender, EventArgs e)
        {
            txtPaciente.Text = "";
        }

       
    }
}
